package org.alanlau.rabbitmq.config;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author alan
 * @version 1.0
 * @date 2021/4/8 15:33
 */
@Component
public class SendCallBack implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback {
    @Autowired
    public SendCallBack(RabbitTemplate rabbitTemplate) {
        rabbitTemplate.setConfirmCallback(this);
        rabbitTemplate.setReturnCallback(this);
    }

    /**
     * 消息到达交换机的回调
     *
     * @param correlationData
     * @param ack             是否到达交换机
     * @param cause           如果没有接收成功，返回拒绝的原因
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        if (ack) {
            System.out.println("消息正常到达交换机");
        } else {
            System.out.println("消息没有到达交换机，原因为：" + cause);
        }
    }

    /**
     * 当消息到达队列失败时，回调的方法，消息被退回了，我们可以把消息记录下来，分析错误的原因，以后重新发送，这样的话，消息就不会再丢失了
     *
     * @param message    消息体
     * @param replyCode  回退的响应码
     * @param replyText  响应文本
     * @param exchange   该消息来自哪个交换机
     * @param routingKey 该消息的路由key
     */
    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        System.out.println("{" + new String(message.getBody()) + "} 到达队列失败" + "; " + replyText + " 交换机为：" + exchange + "; 路由key：" + routingKey);
        // 处理重新发送的问题
    }
}
